package com.AdvancedDemos.FileAndIO;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class 字符串与字节数组转换_编码解码标准 {
    public static void main(String[] args) {
        /**
         * 字符编码
         * byte[] getBytes() --- 使用平台的默认字符集将该String编码为一系列字节,将结果存储到字节数组中 (调用:str.getBytes())
         * byte[] getBytes(String charsetName) --- 使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中 (调用:str.getByts("GBK"))
         *
         * 字符解码
         * String(byte[] bytes) --- 通过使用平台的默认字符集解码指定的字节数组来构造新的String
         * String(byte[] bytes,String charsetName) --- 通过指定的字符集解码指定的字节数组来构造新的String
         */

        /*
        万国码UTF-8中
        1字节字符首位为0 (兼容ASCII码)
        2字节字符首位为110 10
        3字节字符首位为1110 10 10
        4字节字符首位为11110 10 10 10

        英文数字占1字节:首位为0
        中文占3字节:每个字节首位为1110 10 10
        (GBK中中文占2个  字节)
        */

        //1.编码
        String str = "A王1";//UTF-8中 A-1字节 王-3字节 1-1字节
        byte[] utf_8 = str.getBytes();//默认按照平台字符集编码,如:UTF-8
        System.out.println(Arrays.toString(utf_8));//[65, -25, -114, -117, 49] 有5个字节

        byte[] gbk;
        try {
            gbk = str.getBytes("GBK");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Arrays.toString(gbk));//[65, -51, -11, 49] 只有4个字节

        //2.解码
        String s = new String(utf_8);//按照平台默认编码UTF-8解码UTF-8编码的字节数组
        System.out.println(s);//A王1  没有出现乱码

        String s1 = new String(gbk);//按照平台默认编码UTF-8解码GBK编码的字节数组
        System.out.println(s1);//A��1 出现了乱码

        String s2;
        try {
            s2 = new String(utf_8, "GBK");//按照GBK解码utf-8编码的字节数组
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        System.out.println(s2);//A鐜�1 出现了乱码

        String s3;
        try {
            s3 = new String(gbk, "GBK");//按照GBK解码GBK编码的字节数组
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        System.out.println(s3);//A王1 没有出现乱码

        /*总之,记住编码用的什么字符集,解码就应当用什么字符集,否则会出现乱码*/

    }
}
